//引入头文件，这里使用修改后的头文件
#include "ESP8266.h"
#include "dht11.h"
#include "SoftwareSerial.h"
//ESP8266WIFI设置
#define SSID "Redmi K50"    //填写2.4GHz的WIFI名称，不要使用校园网
#define PASSWORD "crzinan666"//填写自己的WIFI密码
#define HOST_NAME "api.heclouds.com"  //API主机名称，连接到OneNET平台，无需修改
#define DEVICE_ID "889995618"       //填写自己的OneNet设备ID
#define HOST_PORT (80)                //API端口，连接到OneNET平台，无需修改
String APIKey = "I2PsDNZbEvAP6Z0fL0icpO8l=UY="; //与设备绑定的APIKey


//定义接入Arduino连接管脚
#define DHT11PIN 4
#define WINDPIN 1
#define DUSTPIN 0
#define LEDPOWER 2;

//温湿度传感器DHT11
/*************************
 * 管脚名称|说明
 * VDD|供电，接Arduino 5V
 * DATA|信号，接S4
 * NC|空脚，不用接
 * GND|接地
*************************/
dht11 DHT11;//实例化
float humValue;//湿度值
float temValue;//温度值

//风速变送器
/*************************
 * 管脚名称|说明
 * VDD|供电，接Arduino 5V
 * VS|输出信号，接A1
 * GND|接地
*************************/
int windValue;//ADC输出值
int windLevel;//风力等级

//灰尘传感器
/*************************
 * 管脚名称|说明
 * Vcc(pin6)|供电，接Arduino 5V
 * Vo(pin5)|输出信号，接A0
 * GND(pin4)|接地
 * V_led(pin1)|连接在 150欧姆电阻 和 220uf电容的中间，后接5V电源
 * led_gnd(pin2)|接地
 * LED|Arduino PIN2(开关LED)
*************************/
float dustValue;//ADC输出值
float dustVol;//模拟电压值
int Pm2_5;//PM2.5

//定义ESP8266所连接的软串口
/*********************
 * 该实验需要使用软串口
 * Arduino上的软串口RX定义为D3,
 * 接ESP8266上的TX口,
 * Arduino上的软串口TX定义为D2,
 * 接ESP8266上的RX口.
 * D3和D2可以自定义,
 * 但接ESP8266时必须恰好相反
 *********************/
SoftwareSerial mySerial(3, 2);
ESP8266 wifi(mySerial);

void setup()
{
    pinMode(DHT11PIN,INPUT);
    pinMode(WINDPIN,INPUT);
    pinMode(DUSTPIN,INPUT);//定义输入端口

    mySerial.begin(115200); //初始化软串口
    Serial.begin(9600);     //初始化串口
    Serial.print("setup begin\r\n");

    //以下为ESP8266初始化的代码
    Serial.print("FW Version: ");
    Serial.println(wifi.getVersion().c_str());

    if (wifi.setOprToStation()) {
    Serial.print("to station ok\r\n");
    } else {
    Serial.print("to station err\r\n");
    }

    //ESP8266接入WIFI
    if (wifi.joinAP(SSID, PASSWORD)) {
    Serial.print("Join AP success\r\n");
    Serial.print("IP: ");
    Serial.println(wifi.getLocalIP().c_str());
    } else {
    Serial.print("Join AP failure\r\n");
    }


    mySerial.println("AT+UART_CUR=9600,8,1,0,0");
    mySerial.begin(9600);
    Serial.println("setup end\r\n");
}

void loop(){
    //温湿度传感器
    humValue = (float)DHT11.humidity;
    temValue = (float)DHT11.temperature;

    //风速变送器
    windValue = analogRead(A1);
    windLevel = 6*windValue*(5.0/1023.0);//风速等级和输出电压值呈线性关系

    //灰尘传感器
    digitalWrite(ledPower,LOW);
    delayMicroseconds(280);
    dustValue=analogRead(dustPin);
    delayMicroseconds(40);
    digitalWrite(ledPower,HIGH);
    delayMicroseconds(offTime);
    dustVot = dustVal*0.0049;
    //公式根据根据官方规格书中的《Fig. 3 Output Voltage vs. Dust Density》图表计算得出
    dustDensity = ((dustVot*0.1667)-0.1)*1000;
    //  将粉尘的浓度转换为PM2.5指数
    //  参考标准为PM2.5中国标准
    if (dustDensity < 35) {
    Pm2_5 = dustDensity * 1.4286;
    }
    else if (dustDensity < 150) {
    Pm2_5 = (dustDensity - 35)* 1.25 + 50 ;
    }
    else if (dustDensity < 250) {
    Pm2_5 = (dustDensity - 150)* 1 + 200 ;
    }
    else Pm2_5 = (dustDensity - 250)* 0.8 + 300 ;


    //串口监视器输出
    Serial.print("Humidity (%) is");
    Serial.println(humValue,2);
    Serial.print("Temperature (C) is")
    Serial.println(temValue,2);
    Serial.print("Wind speed is :")
    Serial.println(Level;)
    Serial.println(" level now.",2);
    Serial.prinln("Pm 2.5 is");
    Serial.println(Pm2_5,2);

    //ESP8266发送数据
    if (wifi.createTCP(HOST_NAME, HOST_PORT)) { //建立TCP连接，如果失败，不能发送该数据
      Serial.print("create tcp ok\r\n");
      char buf[10];
      //拼接发送data字段字符串
      String jsonToSend = "{\"Temperature\":";
      dtostrf(temValue, 1, 2, buf);
      jsonToSend += "\"" + String(buf) + "\"";
      jsonToSend += ",\"Humidity\":";
      dtostrf(humValue, 1, 2, buf);
      jsonToSend += "\"" + String(buf) + "\"";
      String jsonToSend = "{\"Wind_speed\":";
      dtostrf(windLevel, 1, 2, buf);
      jsonToSend += "\"" + String(buf) + "\"";
      String jsonToSend = "{\"Pm2_5\":";
      dtostrf(Pm2_5, 1, 2, buf);
      jsonToSend += "\"" + String(buf) + "\"";
      jsonToSend += "}";

      //拼接POST请求字符串
      String postString = "POST /devices/";
      postString += DEVICE_ID;
      postString += "/datapoints?type=3 HTTP/1.1";
      postString += "\r\n";
      postString += "api-key:";
      postString += APIKey;
      postString += "\r\n";
      postString += "Host:api.heclouds.com\r\n";
      postString += "Connection:close\r\n";
      postString += "Content-Length:";
      postString += jsonToSend.length();
      postString += "\r\n";
      postString += "\r\n";
      postString += jsonToSend;
      postString += "\r\n";
      postString += "\r\n";
      postString += "\r\n";

      const char *postArray = postString.c_str(); //将str转化为char数组

      Serial.println(postArray);
      wifi.send((const uint8_t *)postArray, strlen(postArray)); //send发送命令，参数必须是这两种格式，尤其是(const uint8_t*)
      Serial.println("send success");
      if (wifi.releaseTCP()) { //释放TCP连接
        Serial.print("release tcp ok\r\n");
      } else {
        Serial.print("release tcp err\r\n");
      }
      postArray = NULL; //清空数组，等待下次传输数据
    } else {
      Serial.print("create tcp err\r\n");
    }


    Serial.println("");

    delay(10000);


}